package org.example.listener;

import org.example.operator.OperatorField;
import org.example.redo.Redo;
import com.google.common.eventbus.Subscribe;

import java.util.Objects;

/**
 *
 * Redo 监听器，用来记录，当数据操作完成后，添加 redo 操作结果日志
 * @author Silver
 * @return
 */
public class RedoEventListener  {

    /**
     * 监听器名称
     */
    private String name;

    /**
     * Redo 操作实例
     */
    private Redo redo;

    public RedoEventListener(String name) {
        this.name = name;
    }

    public RedoEventListener(String name, Redo redo) {
        this.name = name;
        this.redo = redo;
    }

    /**
     *
     * 监听事件的方法
     * @author Silver
     * @param event 监听的事件
     * @return void
     */
    @Subscribe
//    @AllowConcurrentEvents
    public void listen(NumberEvent event){
        Object obj = event.getObj();
        if (Objects.isNull(obj)){
            //异常情况灵活处理
            return;
        }
        if (!(obj instanceof OperatorField)){
            //异常情况灵活处理
            return;
        }
        //获取操作数据
        OperatorField operatorField = (OperatorField) obj;
        //进行 redo 日志记录 将操作的结果保存到 redo log中
        redo.redoLog(operatorField.getAfterResult().getFinalResult());
    }

}
